﻿using System;
using System.Windows.Forms;
using Business;
using Business.Seguranca;
using DevExpress.XtraEditors;

namespace Bonesoft.Controls
{
    public delegate void AntesDeSalvarHandler(object source, RepositoryControlEventArgs e);
    public partial class RepositoryControl : DevExpress.XtraEditors.XtraUserControl
    {
        #region Construtores

        public RepositoryControl()
        {
            InitializeComponent();
            cmdExcluir.Enabled = false;
        }

        #endregion

        #region Eventos
        public event AntesDeSalvarHandler AntesDeSalvar;

        protected virtual void OnAntesDeSalvar(object source, RepositoryControlEventArgs e)
        {
            AntesDeSalvarHandler handler = AntesDeSalvar;
            e.Entity = DataSource;
            if (handler != null) handler(source, e);
        }

        #endregion

        #region Propriedades


        public Object DataSource { get; set; }

        private XtraForm _form;

        public XtraForm Form
        {
            get
            {
                return _form;
            }
            set
            {
                _form = value;
                if (_form != null)
                {
                    _form.KeyDown += _form_KeyDown;
                }
            }
        }

        private bool _modoInclusao;

        public bool isModoInclusao
        {
            get
            {
                return _modoInclusao;
            }
        }

        void _form_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.SelectNextControl(this.ActiveControl, !e.Shift, true, true, true);
            }
            switch (e.KeyData)
            {
                case Keys.F5:
                    Excluir();
                    break;
                case Keys.F6:
                    Salvar();
                    break;
                case Keys.F7:
                    Cancelar();
                    break;
                case Keys.Escape:
                    Form.Hide();
                    break;
            }
        }
        #endregion

        #region Métodos

        public void ModoEdicao()
        {
            _modoInclusao = false;
            cmdExcluir.Enabled = true;
            cmdExcluir.Enabled = SegurancaUtils.GetPermissaoForm(Form.Name).PermissaoDelete;
            cmdSalvar.Enabled = SegurancaUtils.GetPermissaoForm(Form.Name).PermissaoUpdate;
        }

        public void ModoInclusao()
        {
            _modoInclusao = true;
            cmdExcluir.Enabled = false;
            var permissao = SegurancaUtils.GetPermissaoForm(Form.Name);
            if (permissao == null)
            {
                return;
            }
            cmdSalvar.Enabled = permissao.PermissaoInsert;
        }
        #endregion
        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            Salvar();
        }


        private void Salvar()
        {
            loadSplashManager.ShowWaitForm();
            try
            {

                var repEvent = new RepositoryControlEventArgs();
                OnAntesDeSalvar(this, repEvent);
                if (!repEvent.CancelSave)
                {
                    RepositoryBase<object>.Session = repEvent.Session;
                    RepositoryBase<object>.SaveOrUpdate(DataSource);
                    OperacaoFinalizada();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível salvar o registro.\n\n" +
                                "Mensagem do erro: " + ex.InnerException);
            }
            if (loadSplashManager.IsSplashFormVisible)
            {
                loadSplashManager.CloseWaitForm();
            }
        }

        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            Cancelar();
        }

        private void Cancelar()
        {
            loadSplashManager.ShowWaitForm();
            OperacaoFinalizada();
        }

        private void cmdExcluir_Click(object sender, EventArgs e)
        {
            Excluir();
        }

        private void Excluir()
        {
            try
            {
                if (cmdExcluir.Enabled)
                {
                    loadSplashManager.ShowWaitForm();
                    var s = "Deseja realmente excluir este item?";
                    var result = MessageBox.Show(s, "Atenção", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        RepositoryBase<object>.Delete(DataSource);
                        OperacaoFinalizada();
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao excluir registro.\n\n" +
                                                "Mensagem do erro: " + ex.InnerException);

            }

        }

        public void OperacaoFinalizada()
        {
            Form.Hide();
            loadSplashManager.CloseWaitForm();
        }
    }
}
